package main

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)
/**
 * Profile属于User user表外键关联profile表
 * belongs to 会与另一个模型建立一对一关系，因此声明的每一个模型实例都会”属于”另一个模型实例。
 */
type Profile struct {
	gorm.Model
	Name string
}

type User struct {
	gorm.Model
	Profile Profile
	ProfileId int
}

type Author struct {
	gorm.Model
	Name string `gorm:"type:varchar(50)"`
}

type Post struct {
	gorm.Model
	Title string `gorm:"type:varchar(50)"`
	Author Author
	AuthorId int
}

func main() {
	//db的类型是 *gorm.DB
	db, err := gorm.Open("mysql", "wenjuhao:123456@/goweb?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		panic(err)
	}
	defer db.Close()
	//声明一个User结构的变量用来接收查询的结果
	var res User
	//使用Scan将查询的结果写入声明的结构变量，注意要传入指针否则会引发panic，底层要通过指针找到内存地址，简要理解如果传入的是一个值，那么久无法从外接获得结果了。
	//使用Table要输入数据库这是存在的表名，而不是结构体的名字
	//使用Model就传入定义的model的结构体的指针
	db.Table("users").Where("id = ?", 1).Scan(&res)
	fmt.Printf("user.id is %d\n", res.ID)
	db.Model(&User{}).Where("id = ?", 2).Scan(&res)
	fmt.Printf("user.id is %d\n", res.ID)

	//获取第一条记录，按主键排序
	var one User
	db.Model(&User{}).First(&one)
	fmt.Println("first: ", one.ID)

	//获取最后一条记录，按主键排序
	var lastOne User
	db.Model(&User{}).Last(&lastOne)
	fmt.Println("last: ", lastOne.ID)

	//根据主键获取一条记录
	var other User
	db.Model(&User{}).First(&other, 10)
	fmt.Println("other: ", other.ID)

	//添加where条件,批量查询
	//First返回一条，Find返回多条
	where := []User{}
	db.Where("id > ?", 2).Find(&where)
	for _, val := range where{
		fmt.Printf("where is id %d\n", val.ID)
	}

	//使用结构体
	where1 := []User{}
	db.Find(&where1, User{ProfileId:11})

	for _, val := range where1{
		fmt.Printf("where1 is id %d\n", val.ProfileId)
	}

	//or 查询
	where2 := []User{}
	db.Where(User{ProfileId:10}).Or(User{ProfileId:11}).Find(&where2);
	for _, val := range where2{
		fmt.Printf("where2 is id %d\n", val.ProfileId)
	}
}